/*
const ResBank = {
  _inherit: 'res.bank', // 继承自 哪个 js model. 若为空, 本身就是 根 model, 直接对应 odoo model
  _name: 'res.bank',    // 对应 odoo model, 若为空, 则依次取 [ 父 js model 的 _name, 自己的 env参数名 ]
  _description: '银行',  // model 名称, 若为空, 则依次取 [ 父 js model 的 _description, 自己的 env参数名 ]
  _fields: {            // odoo model 的 feilds
    name: { type: 'char', string: '名称' },
    parent_id: {
      type: 'many2one',
      string: '',
      fields: {},  // 编辑时, get_options 用
      domain: {},  // 编辑时, get_options 用
      filter: ({record, options})=>{}, // 编辑时, 渲染前调用
    },
  },

  metadata: { // 所有对页面的控制 在 metadata 中定义
    actions: {  // 定义对模型的操作权限, 默认 true
        search: true,
        browse: true,
        create: false, // 将隐藏新增按钮
        write: false, // 将隐藏编辑按钮
        unlink: false // 将隐藏删除按钮
    },

    // TBD 2020-6-28,  现在没处理 domain 参数
    domain: {}, // 列表页面的 查询时的 domain 参数. 默认为 空
    order: '',  // 列表页面的 查询时的 order 参数. 默认为 空
    search:  [ // 过滤条件

    ],

    fieldsForSearch: {}, // 列表页面的 查询时的 fields 参数. 若为空, 则默认为 metadata.fields, 但是不嵌套, 不显示 o2m
    fieldsForBrowse: {}, // 详情页面的 查询时的 fields 参数. 若为空, 则默认为 metadata.fields

    propForList: {  // 列表页面的 参数 // 列表页面 每条记录的展示格式, mobile 对应 van-cell

      title: rec => {
        return `${rec.display_name}`  // 默认显示 display_name
      },

      icon: rec => {
        return get_image('res.country', rec.id, 'image') // 默认不显示
      },

      label: rec => {
        return ``  // 默认不显示
      },
      value: rec => {
        return ``  // 默认不显示
      }
    },

    propForView: { // 详情或编辑页面的 参数
      fields: {}, // 详情页面 普通显示, 要展示的字段

      notebook: { // 详情页面 额外的 可折叠展示的
        default: 'Contacts', // 默认打开哪个 子page
        pages: [
          {
            name: 'Contacts',
            label: '联系人及地址',
            fields: { child_ids: null }, // 若展示字段 仅定义一个 且为 o2m, 则在这个page中 列表展示
            fields: { user_id: null,comment: { label: null } } // 若展示字段定义为普通字段, 则在这个page中 展示多个字段

            // TBD 编辑页面如何定义?
            propForList: { // o2m字段 列表展示的定义
              title: rec => {
                return `${rec.name}`
              },
              icon: rec => {
                return get_image('res.partner', rec.id, 'image_1920')
              },

              label: rec => {
                return `${rec.type || ''}`
              },
              value: rec => {
                return ``
              }
            },
          }
        ]
      }
    },

  }

  extend: BaseClass => {} // 对 ModelClass 的扩展

}

const Models = {
  'res.bank2': ResBank  // key=名称
}

export default Models // 导出

// env(model) 的 返回值 格式:
class Model {
  metadata: {
    description: '银行', // 对应定义中的 _description
    fields: {  // 对应定义中的 _fields, 默认补充 display_name
      display_name: { type: 'char', string: '名称' },
      name: { type: 'char', string: '名称' },
    },
    // 其他 metadata
  }
  async call(){}  // 其他函数,本身extend中扩展的, 以及 继承自 父 jsmodel 或 ModelClass
}
*/

const ResBank = {
  _description: '银行',
  _name: 'res.bank',
  _fields: {
    name: { type: 'char', string: '名称' },
    bic: { type: 'char', string: '编码' }
  },

  extend: BaseClass => {
    class ModelClass extends BaseClass {
      global_domain(domain) {
        return super.global_domain(domain)
      }

      async browse_one(rid, kwargs) {
        const res = await super.browse_one(rid, kwargs)
        return res
      }

      async search(params = {}) {
        const res = await super.search(params)
        return res
      }
    }
    return ModelClass
  }
}

const ResPartnerBank = {
  // _name: 'res.partner.bank',
  _description: '银行账号',
  _fields: {
    acc_number: { type: 'char', string: '账号' },
    acc_holder_name: { type: 'char', string: '账号名称' },
    partner_id: { type: 'many2one', string: '持有人' },
    bank_id: { type: 'many2one', string: '银行' }
    // bank_name: { type: 'char', string: '银行名称' },
    // bank_bic: { type: 'char', string: '银行编码' }
  },

  metadata: {
    propForList: {
      title: rec => {
        return `${rec.display_name} ${rec.acc_holder_name ||
          rec.partner_id__name} `
      },

      label: rec => {
        return `${rec.bank_id__name}`
      }
    }
  }
}

const ResPartnerTitle = {
  // _name: 'res.partner.title',
  _description: '参与人头衔',
  _fields: {
    name: { type: 'char', string: '名称' },
    shortcut: { type: 'char', string: '缩写' }
  },

  metadata: {
    propForList: {
      title: rec => {
        return `${rec.display_name} ${rec.shortcut} `
      },

      label: rec => {
        return ``
      }
    }
  }
}

const PartnerCategory = {
  // _name: 'res.partner.category',
  _description: '参与人标签',
  _fields: {
    name: { type: 'char', string: '名称' },
    parent_path: {
      type: 'char',
      string: 'parent_path',
      hidden: true,
      readonly: true
    },

    parent_id: {
      // m2o 字段. 需要定义 可选项
      // fields 为 get_options 的参数
      // filter 为 最后渲染时 调用的函数
      type: 'many2one',
      string: '父标签',
      fields: { name: null, parent_path: null },
      filter: ({ record, options }) => {
        // console.log('PartnerCategory,', record, options)
        // parent_id 不能选自己, 不能选儿孙
        return options.filter(item => {
          const parent_path = item.object.parent_path
            .split('/')
            .map(item => Number(item))

          return item.value !== record.id && !parent_path.includes(record.id)
        })
      }
    }
  },

  metadata: {
    order: 'display_name',

    propForView: {
      //
    },

    propForList: {
      title: rec => {
        return `${rec.display_name}`
      },

      label: rec => {
        return `${rec.parent_path}`
      }
    }
  }
}

const Models = {
  'res.bank': ResBank,
  'res.partner.bank': ResPartnerBank,
  'res.partner.title': ResPartnerTitle,
  'res.partner.category': PartnerCategory
}

export default Models
